mod scope;
mod cast;
mod infer;

// Rust 通过静态类型确保类型安全。变量绑定可以在声明时说明类型，
// 不过在多数情况下，编译器能够从上下文推导出变量的类型，从而大大减少了类型说明的工作。
// 使用 let 绑定操作可以将值（比如字面量）绑定（bind）到变量。
// 变量绑定默认是不可变的（immutable），但加上 mut 修饰语后变量就可以改变。
fn main() {}

// 变量绑定默认是不可变的（immutable），但加上 mut 修饰语后变量就可以改变。
#[test]
fn test_mut() {
    // 变量绑定默认是不可变的（immutable），但加上 mut 修饰语后变量就可以改变。
    let mut mutable_binding = 1;
    println!("Before mutation: {}", mutable_binding);
    // 正确代码
    mutable_binding += 1;
    println!("After mutation: {}", mutable_binding);
}

#[test]
fn test_normal() {
    let an_integer = 1u32;
    let a_boolean = true;
    let unit = ();

    // 将`an_integer` 复制到 `copied_integer`
    let copied_integer = an_integer;
    println!("an_integer value: {}", an_integer);
    println!("Copied value: {}", copied_integer);
    println!("a boolean: {:?}", a_boolean);
    println!("unit value: {:?}", unit);
}

#[test]
fn test_unused() {
    // 编译器会对未使用的变量绑定产生警告；可以给变量名加上下划线前缀来消除警告。
    let _unused_variable = 3u32;
    let _noisy_unused_variable = 2u32;
    // 改正 ^ 在变量名前加上下划线以消除警告
}

#[test]
fn test_var_size() {
    let price = 188;
    println!("price is {}", price);

    let x = '中';
    let y = 'a';
    let str = "这是测试文本，中华人民共和国，国歌";
    println!(
        "字符'中'占用了 {} 字节的内存大小",
        std::mem::size_of_val(&x)
    );
    println!("字符'a'占用了 {} 字节的内存大小", std::mem::size_of_val(&y));
    println!(
        "字符'这是测试文本，中华人民共和国，国歌'占用了 {} 字节的内存大小",
        std::mem::size_of_val(&str)
    );
    println!(
        "price占用了 {} 字节的内存大小",
        std::mem::size_of_val(&price)
    );
}
